// 接口 针对对象的类型约束

// 接口  关键字 interface 
// 写法和类有点相似

interface Person {
  a: number | string | boolean // 联合类型
  name?:string // 可选类型
  readonly age:number // 只读
} // Person类型 key : a  类型 : number  // 约束变量



function fnObj(params:Person){ // {a:number}

}

let obj : Person=  {a:'',name:'1234',age:123}

// obj.age = 20

fnObj({a:'',name:'1234',age:123})


// 接口
interface MyTypeInterface{
  name:string;
  age:number;
  [propName:string]:number|string // 任意类型
}

// 声明一个对象 必须有name age属性 除此之外 可以添加一个任意属性 值的类型 是string | number

let obj2 : MyTypeInterface = {
  name:'张三',
  age:20,
};

// typeof obj2.age //?

// type 类型别名 : 类型别名用来给一个类型起一个新的名字
type Name = string; // 此时的Name就是一个类型 是string类型的别名
type NameAndAge = string | number; // 
let aaa: NameAndAge
type FnType = ()=>string ;
type ThreeType = FnType | NameAndAge; // 
let three :ThreeType 
// three = true // ×
// three = function(){return '123'} // √
// three = 123 // √


